#include <string> //不等于string.h也不等于cstring
#include <iostream>
using namespace std;

int checkInt(const char* ch, int len);//检查字符串是不是整数，不是返回0，正整数返回1，负整数返回-1
int checkInt(string& str);

//测试一：string的构造
void test1()
{
	string str1;//调用默认构造函数构造一个空字符串
	//string str1('g');//错误的构造方法
	string str2("Hello World!");//字符串构造
	string str3(str2);//拷贝构造
	string str4(10,'c');//10个c
	char buf[5] = { 'g','o','o','d','\0' };
	string str5(buf);//string 类型可以直接赋值array
	string str6("hello world", 5);//前5个字符
	string str7("hello world!", 2, 3);//从第2个位置开始，三个字符结果时llo
	
	
	cout <<"str1="<< str1 << endl;
	cout <<"str2="<< str2 << endl;
	cout <<"str3="<< str3 << endl;
	cout <<"str4="<< str4 << endl;
	cout <<"str5="<< str5 << endl;
	cout <<"str6="<< str6 << endl;
	cout <<"str7="<< str7 << endl;
}
	

//测试二：string赋值
void test2()
{
	string str9;
	string str10;
	string str11;
	string str12;
	string str13;
	string str14;
	string str15;
	string str16;

	str9 = "hello world";
	str10 = str9;
	str11 = 'c';
	str12.assign("hi jack");
	str13.assign("hello world", 2, 3);
	str14.assign(str9);
	str15.assign(10, 'h');
	str16.assign(str9, 2, 4);
	cout << "str9=" << str9 << endl;
	cout << "str10=" << str10 << endl;
	cout << "str11=" << str11 << endl;
	cout << "str12=" << str12 << endl;
	cout << "str13=" << str13 << endl;
	cout << "str14=" << str14 << endl;
	cout << "str15=" << str15 << endl;
	cout << "str16=" << str16 << endl;
}


//测试三：存取字符操作,[]操作越位不会throw错误，at操作会throw错误
void test3()
{
	string str17("hello world!");
	string str18("hey girl wanna ride?");
	cout << str17[1] << str17[3] << endl;
	cout << str18.at(2) << str17.at(7) << endl;
	try
	{
		//str17[20];
		str17.at(20);//[]操作越位不会throw错误，at操作会throw错误
	}
	catch (out_of_range &err)
	{
		cout << err.what() << endl;
	}
}


//测试四：字符串拼接，在多线程项目中 + 比append效率高
void test4()
{
	string str1{ 'z' };
	string str2("Hello World!");
	string str3(str2);
	string str4(10, 'c');
	char buf[5] = { 'g','o','o','d','\0' };
	string str5(buf);
	string str6("hello world", 5);//前5个字符
	string str7("hello world!", 2, 3);//从第2个位置开始，三个字符结果时llo

	str1 += str2;//+=方法
	str2 = str4 + str5;
	str3 += "goodday";
	str4 += 'y';//拼接一个char类型
	str5.append(str7);
	str6.append(str7, 1, 2);//加上str7 1号位置后面2字符
	str7.append("zhongguo", 3);//加前面3字符

	cout << "str1=" << str1 << endl;
	cout << "str2=" << str2 << endl;
	cout << "str3=" << str3 << endl;
	cout << "str4=" << str4 << endl;
	cout << "str5=" << str5 << endl;
	cout << "str6=" << str6 << endl;
	cout << "str7=" << str7 << endl;
}


//测试5：查找和替换,找不到返回-1
void test5()
{
	string str8 = "abcdef#abc7hi#j_juuhiuz#yyd fo";
	string str9 = "ju";
	string str10 = "@$%";
	char buf[] = "!^";

	int pos = 0;
	pos = str8.find('#');//查找字符串第一次出现的位置，find第二个参数默认为0
	cout << pos << endl;
	pos = str8.find('#',2);//find找的是绝对位置，第二个参数为2结果还是6
	cout << pos << endl;
	pos = str8.find("7h", 2);//查找字符串出现的第一个位置，也是绝对位置
	cout << pos << endl;
	pos = str8.find(str9, 2);//查找string类型可行
	cout << pos << endl;
	pos = str8.find(buf, 2);//查找字符串数组类型可行
	cout << pos << endl;

	pos = str8.rfind('#');//从右边开始查找#出现的第一个位置
	cout << pos << endl;
	pos = str8.rfind('#',10);//从第n个位置开始向左边查找#出现的第一个位置，右边有的不会查找
	cout << pos << endl;
	pos = str8.rfind(str9, 20);
	cout << pos << endl;
	pos = str8.rfind(buf, 25);
	cout << pos << endl;

	str8.replace(2, 4, str10);//从2号位置开始删除4个字符，然后插入str10的所有字符
	cout << "str8=" << str8<< endl;
	str8.replace(10, 1, buf);//从10 号位置开始删除1个字符，然后插入buf的所有字符
	cout << "str8=" << str8 << endl;
}


//测试6：字符串相等,按ASCii顺序比较字符串大写，相等结果返回0
void test6()
{
	string str1 = "hello";
	string str2("Hello");
	int end = str1.compare(str2);
	cout << end << endl;
}
	

//测试7：插入和删除
void test7()
{
	string str1 = "hello";
	string str2 = "$$";

	str1.insert(2, "**");//2号位置的字符后移然后插入对应的字符串
	cout << "str1=" << str1 << endl;
	str1.insert(2, str2);
	cout << "str1=" << str1 << endl;
	str1.insert(2, 5,'@');//插入5个@
	cout << "str1=" << str1 << endl;
}



//测试8：sizeof（）和string.size()/string.lenth()这两个函数结果一样
void test8()
{
	string str1 = "hello";
	cout << sizeof(str1) << endl;//28
	cout << str1.size() << endl;//5
}


//测试9：迭代器使用
void test9()
{
	string str = "hello";
	//正向迭代
	for (string::iterator it = str.begin(); it != str.end(); it++)
	{
		cout << *it;
	}
	cout << endl;
	//反向迭代
	for (string::reverse_iterator it = str.rbegin(); it != str.rend(); it++)
	{
		cout << *it;
	}
	cout << endl;
}

// 测试10：引用参数const std::string&可以接收const char*类型数据
std::string fortest10(const std::string& str)
{
	cout << str << endl;
	return std::string("good day");
}
void test10()
{
	cout<< fortest10("hello world!") << endl;
}




//--------------------main--------------------------

int main()
{
	test10();
	return 0;
}














int checkInt(const char* ch, int len)//检查字符串是不是整数，不是返回0，正整数返回1，负整数返回-1
{
	if (len <= 1)
	{
		if (*ch >= 48 && *ch <= 57)
			return 1;
		return 0;
	}
	if (*ch == '-')//检查负数
	{
		for (int i = 1; i < len; i++)
		{
			if (*(ch + i) < 48 || *(ch + i) > 57)
				return 0;
		}
		return -1;
	}

	for (int i = 0; i < len; i++)
	{
		if (*(ch + i) < 48 || *(ch + i) > 57)
		{
			return 0;
		}
	}

	return 1;
}


int checkInt(string& str)//检查字符串是不是整数string做参数，不是返回0，正整数返回1，负整数返回-1
{
	if (str.size() <= 0)
	{
		return 0;
	}
	if (str[0] == '-')//检查负数
	{
		for (int i = 1; i < str.size(); i++)
		{
			if (str[i] < 48 || str[i] > 57)
				return 0;
		}
		return -1;
	}

	for (int i = 0; i < str.length(); i++)
	{
		if (str[i] < 48 || str[i] > 57)
		{
			return 0;
		}
	}

	return 1;
}
